Dataset Details
The data used in this project is sourced from the American Community
Survey 2019 5-Year Public Use Microdata Sample (PUMS) collected by the
United States Census Bureau <data.census.gov>. The dataset
contains a plethora of variables, but I narrowed my investigation to a
handful of socioeconomic attributes concerning first-generation
Americans. A first-generation American is a foreign born person
who has moved to the United States of America seeking permanent
residency, regardless of citizenship status with the U.S.
Therefore, in the below graphs when we see a country, for
example, Mexico, we are referring to a population of
first-generation Americans, who were born in Mexico, and migrated to the
United States. Not the population of Mexico.
In other words, the country refers to the origin country of the
population.
The data from the Census Bureau came in the form of many separate csv
files, one for each variable, requiring a lot of data wrangling. A
summary dataframe that merges all relevant variables for all 143 origin
countries is shown below.
Objectives
I recently read a book on demographics by Peter Zeihan, “The
End of the World is Just the Beginning: Mapping the Collapse of
Civilization”, a rather optimistic title. In his book Zeihan
highlights the very problematic demographics of the majority of
developed nations, which he believes will inevitably lead to a sever
population collapse over the next half century. America is one of few
first world countries with optimistic demographics, in no small part to
high levels of immigration. This is what sparked my interest in
exploring U.S. first-generation immigration data.
I wanted to understand who was migrating to the U.S., were they
assimilating, gaining citizenship, starting families, finding work, etc.
in hopes of better understand a fundamental part of the United State’s
demographic future. My exploration focused on:
- Demographics: Who is immigrating to the United
States?
- Citizenship: Are they gaining citizenship?
- Family: Are they finding partners and starting
families?
- Education: Are they bettering themselves through
education?
- Income: How much money are they making?
Demographics
Who is immigrating to the United States of
America?
Findings
The total population of the United States is 332
million.
Around 41,687,472 million people have migrated
to the United States over the last century, accounting for 13% of the
U.S. population.
An estimated 10,723,968 million of the U.S. immigrant population
is from Mexico. Mexico alone accounts for 33% of all immigration
into the United States.
Because there are so many different nationalities that make up
America’s immigrant population, I will be analyzing the data primarily
in two subsets:
- The top 25 first-generation populations, which
together account for 86% of all immigration.
- The 7 global sub regions of African, Asia, Europe,
Latin America, Middle East, North America, and Oceania.
Citizenship
At what rate are different immigrant groups becoming
citizens?
Mexico
The below graph shows the ratio of US Citizens to Non-citizens by
entry decade into the United States. For instance, for Mexicans who
migrated to the United States in the 1950s, currently 19% are not U.S.
citizens, while 81% have gained citizenship. This changes drastically as
we move to the right. Conversely, Mexicans who migrated to the United
States in the 2000s, 84% are not U.S. citizens, while currently 16% have
gained citizenship. We expect immigrants to gain citizenship over time;
therefore, assume that the percent of non-citizens for a given immigrant
population should decrease as time spent in the U.S. increases.
by Country
The line graph below is a linear representation of the trend observed
in the Meixco Bar Chart for the top 25 first-generation
populations in the United States.
The significant trend is that the slope of each line
positively correlates to its countries rate of citizenship.
Findings
Highlight: Mexico, China, India, Columbia, and
El Salvador.
China and Mexico are the two largest immigrant populations in the
United States and show dissimilar citizenship rates.
Chinese immigrants are one of the quickest to gain
citizenship, while Mexican’s are some of the slowest.
India’s citizenship rate mirrors China’s, while El Salvador is
very similar to Mexico’s. There is a regional trend, with Latin American
countries gaining citizenship a lot slower than the other regions,
particularly Asia.
Columbia is an outlier to this trend, showing a
citizenship rate closer to China and India. One of the only Latin
American countries with such a high citizenship rate.
Family
Are first-generation Americans finding partners and
having kids?
by Country

by Region

Marriage vs. Children
Is the
Findings
Percent of population partnered (married or living with partner)
seems consistent across most countries ranging from 32% to
38%.
Nations that practice forms of arranged marriage, India, China,
Korea, and Japan are all on the upper end of that range.
Island nations of Dominican Republic, Haiti, Jamaica, and Puerto
Rico have the four lowest percent of population married.
European countries cluster around the low end of average number
of children per person, with the United Kingdom at 0.6 children per
person. Latin American countries cluster around the high end, with
Guatemala more than doubling the United Kingdom with 1.4
children per person.
There does not seem to be a strong correlation between marriage
and average number of children.
Education
How educated are first-generation
Americans?
Findings
India has the most educated first-generation
population, with 74% of the people having at least a college
degree, and a massive 40% having either a masters or
doctorate. Iran and Russia are the next closest with 60% of
their populations having at least a college degree.
The central American counties of Guatemala, Honduras, El
Salvador, and Mexico all have around 50% of their first-generation
populations without a high school degree. This is significant because
50% of all U.S. immigration originates from Latin America.
The trend holds true when looking at the different sub regions;
however, the difference between first and last is less severe. Asia has
the most educated first-generation cohort, while Latin America has the
least educated.
Income
How does income differ between different first-generation
populations?
by Region
Findings
European immigrants boast the highest average income, but also
the largest IQR among all regions. Luxembourg at the head, and Albania
at the tail.
The Middle East region had the country with the highest
average income, Kuwait at $82,723. The Middle East also had the
lowest average income with Yemen at
$7,773. Note: Kuwait was an extreme outlier and was the only
country removed for graphing purposes.
Latin America showed the lowest income gaps
between countries, but also average incomes that clustered around the
lowest median of $21,190.
Nigeria had one of the highest average incomes. I know very
little about Nigeria and in future analysis I would like to look more
into the cause of the income gap between Nigeria and the other African
nations.
Average Income Distribution
Below is the Distribution of the Average Income
attribute. The average incomes were gathered for each first-generation
population in the United States. The distribution skews slightly left,
but is overall pretty normal for an income distribution. The mean and
standard deviation can be seen in the table below.

| Population |
$28,316 |
10,184 |
Central Limit Theorem
Below are histograms showing the densities of the various sample
means of 1000 random samples of sample sizes 10, 20, 30, and 40. The
means and standard deviations can be seen in the table below.

| Population |
$28,316 |
10,184 |
| 10 |
$28,377 |
3,140 |
| 20 |
$28,270 |
2,123 |
| 30 |
$28,333 |
1,632 |
| 40 |
$28,293 |
1,340 |
Findings
The four histograms confirm that the Average Income
attribute abides by the Central Limit Theorem.
All four of the sample mean histograms are normal
distributions with a mean of ~$28,000. This matches the mean
income of the population.
As expected, the standard deviations of the density
histograms decrease as sample size increases. This is seen
visually, as the graphs get progressively narrower and taller from
sample size 10 to sample size 40. Each distribution is normally centered
around the same mean.
Sampling of Average Income
Three sampling methods were used to analyze the behavior of sampling
the first-generation dataset.
- Sample Random Sampling without Replacement
- Systemic Sampling with Unequal Probabilities
- Unequal probabilities were determined using the population
of the immigrant country
- Stratified Sampling
- Strata determined by the country count for each of 7 global
sub regions (African, Asia, Europe, Latin America, Middle
East, North America, and Oceania).

| Population |
$28,316 |
10,184 |
| SRSWOR |
$28,106 |
9,934 |
| Unequal Systematic |
$25,199 |
8,759 |
| Stratified |
$26,318 |
8,155 |
Findings
SRSWOR: as expected, observed both a mean and
standard deviation extremely close to that of the population.
Unequal Systematic and Stratified: both observed
a mean and standard deviation less than that of the population.
The ~10% decrease in mean average income and
~15% decrease in standard deviation observed when
sampling using unequal systematic and stratified methods can be
explained by looking at the Latin American subset of the
first-generation population.
If we look at the pie chart in the Immigration section,
we can see that the Latin America cohort is responsible for
50% of all immigration into the United States.
If we look at the box plot in the Income section we can
see that the Latin America region has the lowest average
income and lowest variance among all 7
regions.
When we sample using unequal systematic and stratified methods we
are more likely to draw countries from the Latin America
strata because of the regions large population
and because the Latin America region has the most first-generation
countries. The Latin American region has the lowest average income and
least variance, which results in a relative decrease in both the
mean income and standard deviation compared to the
population.
I think that the unequal systematic sample method is the
most accurate representation of the first-generation population’s
average income because it adds a country population dimension
to average income that the other four methods do not. In other words,
when using systematic sampling with unequal probabilities, countries
with larger immigrant populations contribute more to the calculated
average income. This results in a mean income value that is more
representative of the immigrant population.
- To use an analogy, the population mean income is to the Senate, as
the unequal systematic sampling mean income is to the House of
Representatives.
Attribute Correlation
The correlation matrix below shows a lot of correlation between the
different attributes explored above. The tabbed plots display these
different relationships.
Correlation Matrix

Children vs. Average Earnings
Strong Negative Correlation
Education vs. Average Earnings
Strong Positive Correlation
Citizenship vs. Average Earnings
No Correlation
Education vs. Citizenship
Moderate Positive Correlation
# {.unnumbered}
Future Investigation
- I want to explore second-generation American data to look at the
change in education rates, and income. And look into how those changes
impact number of children because as we observed, there was a strong
correlation between income and number of children.
- Europeans have the highest average income, but are not the highest
educated regional cohort. I want to explore the roll of language on
income.
LS0tCnRpdGxlOiAiQW4gRXhwbG9yYXRpb24gb2YgRmlyc3QtR2VuZXJhdGlvbiBBbWVyaWNhbnMiCnN1YnRpdGxlOiAiQ1M1NDQgRmluYWwgUHJvamVjdCAoUHJvZi4gS2FsYXRodXIsIEZhbGwgMjAyMikiCmF1dGhvcjogIkNvZHkgVGhheWVyICB8IE9jdG9iZXIgMTksIDIwMjIiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQod2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UpCmBgYAoKPGJyPgoKIyBEYXRhc2V0IERldGFpbHMKClRoZSBkYXRhIHVzZWQgaW4gdGhpcyBwcm9qZWN0IGlzIHNvdXJjZWQgZnJvbSB0aGUgQW1lcmljYW4gQ29tbXVuaXR5IFN1cnZleSAyMDE5IDUtWWVhciBQdWJsaWMgVXNlIE1pY3JvZGF0YSBTYW1wbGUgKFBVTVMpIGNvbGxlY3RlZCBieSB0aGUgVW5pdGVkIFN0YXRlcyBDZW5zdXMgQnVyZWF1IFw8ZGF0YS5jZW5zdXMuZ292XD4uIFRoZSBkYXRhc2V0IGNvbnRhaW5zIGEgcGxldGhvcmEgb2YgdmFyaWFibGVzLCBidXQgSSBuYXJyb3dlZCBteSBpbnZlc3RpZ2F0aW9uIHRvIGEgaGFuZGZ1bCBvZiBzb2Npb2Vjb25vbWljIGF0dHJpYnV0ZXMgY29uY2VybmluZyBmaXJzdC1nZW5lcmF0aW9uIEFtZXJpY2Fucy4gKipBIGZpcnN0LWdlbmVyYXRpb24gQW1lcmljYW4gaXMgYSBmb3JlaWduIGJvcm4gcGVyc29uIHdobyBoYXMgbW92ZWQgdG8gdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSBzZWVraW5nIHBlcm1hbmVudCByZXNpZGVuY3ksIHJlZ2FyZGxlc3Mgb2YgY2l0aXplbnNoaXAgc3RhdHVzIHdpdGggdGhlIFUuUy4qKgoKLSAgIFRoZXJlZm9yZSwgaW4gdGhlIGJlbG93IGdyYXBocyB3aGVuIHdlIHNlZSBhIGNvdW50cnksIGZvciBleGFtcGxlLCAqTWV4aWNvKiwgd2UgYXJlIHJlZmVycmluZyB0byBhIHBvcHVsYXRpb24gb2YgZmlyc3QtZ2VuZXJhdGlvbiBBbWVyaWNhbnMsIHdobyB3ZXJlIGJvcm4gaW4gTWV4aWNvLCBhbmQgbWlncmF0ZWQgdG8gdGhlIFVuaXRlZCBTdGF0ZXMuIE5vdCB0aGUgcG9wdWxhdGlvbiBvZiAqTWV4aWNvKi4KCi0gICBJbiBvdGhlciB3b3JkcywgdGhlIGNvdW50cnkgcmVmZXJzIHRvIHRoZSBvcmlnaW4gY291bnRyeSBvZiB0aGUgcG9wdWxhdGlvbi4KClRoZSBkYXRhIGZyb20gdGhlIENlbnN1cyBCdXJlYXUgY2FtZSBpbiB0aGUgZm9ybSBvZiBtYW55IHNlcGFyYXRlIGNzdiBmaWxlcywgb25lIGZvciBlYWNoIHZhcmlhYmxlLCByZXF1aXJpbmcgYSBsb3Qgb2YgZGF0YSB3cmFuZ2xpbmcuIEEgc3VtbWFyeSBkYXRhZnJhbWUgdGhhdCBtZXJnZXMgYWxsIHJlbGV2YW50IHZhcmlhYmxlcyBmb3IgYWxsIDE0MyBvcmlnaW4gY291bnRyaWVzIGlzIHNob3duIGJlbG93LgoKYGBge3J9CnByaW50KGFsbF9kZikKYGBgCgo8YnI+CgojIE9iamVjdGl2ZXMKCkkgcmVjZW50bHkgcmVhZCBhIGJvb2sgb24gZGVtb2dyYXBoaWNzIGJ5IFBldGVyIFplaWhhbiwgKioiVGhlIEVuZCBvZiB0aGUgV29ybGQgaXMgSnVzdCB0aGUgQmVnaW5uaW5nOiBNYXBwaW5nIHRoZSBDb2xsYXBzZSBvZiBDaXZpbGl6YXRpb24iLCoqIGEgcmF0aGVyIG9wdGltaXN0aWMgdGl0bGUuIEluIGhpcyBib29rIFplaWhhbiBoaWdobGlnaHRzIHRoZSB2ZXJ5IHByb2JsZW1hdGljIGRlbW9ncmFwaGljcyBvZiB0aGUgbWFqb3JpdHkgb2YgZGV2ZWxvcGVkIG5hdGlvbnMsIHdoaWNoIGhlIGJlbGlldmVzIHdpbGwgaW5ldml0YWJseSBsZWFkIHRvIGEgc2V2ZXIgcG9wdWxhdGlvbiBjb2xsYXBzZSBvdmVyIHRoZSBuZXh0IGhhbGYgY2VudHVyeS4gQW1lcmljYSBpcyBvbmUgb2YgZmV3IGZpcnN0IHdvcmxkIGNvdW50cmllcyB3aXRoIG9wdGltaXN0aWMgZGVtb2dyYXBoaWNzLCBpbiBubyBzbWFsbCBwYXJ0IHRvIGhpZ2ggbGV2ZWxzIG9mIGltbWlncmF0aW9uLiBUaGlzIGlzIHdoYXQgc3BhcmtlZCBteSBpbnRlcmVzdCBpbiBleHBsb3JpbmcgVS5TLiBmaXJzdC1nZW5lcmF0aW9uIGltbWlncmF0aW9uIGRhdGEuCgpJIHdhbnRlZCB0byB1bmRlcnN0YW5kIHdobyB3YXMgbWlncmF0aW5nIHRvIHRoZSBVLlMuLCB3ZXJlIHRoZXkgYXNzaW1pbGF0aW5nLCBnYWluaW5nIGNpdGl6ZW5zaGlwLCBzdGFydGluZyBmYW1pbGllcywgZmluZGluZyB3b3JrLCBldGMuIGluIGhvcGVzIG9mIGJldHRlciB1bmRlcnN0YW5kIGEgZnVuZGFtZW50YWwgcGFydCBvZiB0aGUgVW5pdGVkIFN0YXRlJ3MgZGVtb2dyYXBoaWMgZnV0dXJlLiBNeSBleHBsb3JhdGlvbiBmb2N1c2VkIG9uOgoKMS4gICoqRGVtb2dyYXBoaWNzOioqIFdobyBpcyBpbW1pZ3JhdGluZyB0byB0aGUgVW5pdGVkIFN0YXRlcz8KMi4gICoqQ2l0aXplbnNoaXA6KiogQXJlIHRoZXkgZ2FpbmluZyBjaXRpemVuc2hpcD8KMy4gICoqRmFtaWx5OioqIEFyZSB0aGV5IGZpbmRpbmcgcGFydG5lcnMgYW5kIHN0YXJ0aW5nIGZhbWlsaWVzPwo0LiAgKipFZHVjYXRpb246KiogQXJlIHRoZXkgYmV0dGVyaW5nIHRoZW1zZWx2ZXMgdGhyb3VnaCBlZHVjYXRpb24/CjUuICAqKkluY29tZToqKiBIb3cgbXVjaCBtb25leSBhcmUgdGhleSBtYWtpbmc/Cgo8YnI+CgojIERlbW9ncmFwaGljcyB7LnRhYnNldH0KCiMjIyAqKipXaG8gaXMgaW1taWdyYXRpbmcgdG8gdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYT8qKioKCiMjIGJ5IENvdW50cnkKCmBgYHtyIGZpZy53aWR0aD05LCBmaWcuaGVpZ2h0PTYsIGZpZy5mdWxsd2lkdGg9VFJVRX0KcGNfY291bnRyeQpgYGAKCiMjIGJ5IFN1YiBSZWdpb24KCmBgYHtyIGZpZy53aWR0aD05LCBmaWcuaGVpZ2h0PTYsIGZpZy5mdWxsd2lkdGg9VFJVRX0KcGNfcmVnaW9uCmBgYAoKIyAgey51bm51bWJlcmVkfQoKIyMjICoqRmluZGluZ3MqKgoKLSAgIFRoZSB0b3RhbCBwb3B1bGF0aW9uIG9mIHRoZSBVbml0ZWQgU3RhdGVzIGlzICoqMzMyIG1pbGxpb24qKi4KCi0gICBBcm91bmQgKio0MSw2ODcsNDcyKiogbWlsbGlvbiBwZW9wbGUgaGF2ZSBtaWdyYXRlZCB0byB0aGUgVW5pdGVkIFN0YXRlcyBvdmVyIHRoZSBsYXN0IGNlbnR1cnksIGFjY291bnRpbmcgZm9yIDEzJSBvZiB0aGUgVS5TLiBwb3B1bGF0aW9uLgoKLSAgIEFuIGVzdGltYXRlZCAxMCw3MjMsOTY4IG1pbGxpb24gb2YgdGhlIFUuUy4gaW1taWdyYW50IHBvcHVsYXRpb24gaXMgZnJvbSBNZXhpY28uICoqTWV4aWNvIGFsb25lIGFjY291bnRzIGZvciAzMyUgb2YgYWxsIGltbWlncmF0aW9uIGludG8gdGhlIFVuaXRlZCBTdGF0ZXMuKioKCi0gICBCZWNhdXNlIHRoZXJlIGFyZSBzbyBtYW55IGRpZmZlcmVudCBuYXRpb25hbGl0aWVzIHRoYXQgbWFrZSB1cCBBbWVyaWNhJ3MgaW1taWdyYW50IHBvcHVsYXRpb24sIEkgd2lsbCBiZSBhbmFseXppbmcgdGhlIGRhdGEgcHJpbWFyaWx5IGluIHR3byBzdWJzZXRzOgoKICAgIDEuICBUaGUgKip0b3AgMjUgZmlyc3QtZ2VuZXJhdGlvbiBwb3B1bGF0aW9ucyoqLCB3aGljaCB0b2dldGhlciBhY2NvdW50IGZvciA4NiUgb2YgYWxsIGltbWlncmF0aW9uLgogICAgMi4gIFRoZSAqKjcgZ2xvYmFsIHN1YiByZWdpb25zKiogb2YgQWZyaWNhbiwgQXNpYSwgRXVyb3BlLCBMYXRpbiBBbWVyaWNhLCBNaWRkbGUgRWFzdCzCoE5vcnRoIEFtZXJpY2EsIGFuZCBPY2VhbmlhLgoKPGJyPgoKIyBDaXRpemVuc2hpcCB7LnRhYnNldH0KCiMjIyAqKipBdCB3aGF0IHJhdGUgYXJlIGRpZmZlcmVudCBpbW1pZ3JhbnQgZ3JvdXBzIGJlY29taW5nIGNpdGl6ZW5zPyoqKgoKIyMgTWV4aWNvCgpUaGUgYmVsb3cgZ3JhcGggc2hvd3MgdGhlIHJhdGlvIG9mIFVTIENpdGl6ZW5zIHRvIE5vbi1jaXRpemVucyBieSBlbnRyeSBkZWNhZGUgaW50byB0aGUgVW5pdGVkIFN0YXRlcy4gRm9yIGluc3RhbmNlLCBmb3IgTWV4aWNhbnMgd2hvIG1pZ3JhdGVkIHRvIHRoZSBVbml0ZWQgU3RhdGVzIGluIHRoZSAxOTUwcywgY3VycmVudGx5IDE5JSBhcmUgbm90IFUuUy4gY2l0aXplbnMsIHdoaWxlIDgxJSBoYXZlIGdhaW5lZCBjaXRpemVuc2hpcC4gVGhpcyBjaGFuZ2VzIGRyYXN0aWNhbGx5IGFzIHdlIG1vdmUgdG8gdGhlIHJpZ2h0LiBDb252ZXJzZWx5LCBNZXhpY2FucyB3aG8gbWlncmF0ZWQgdG8gdGhlIFVuaXRlZCBTdGF0ZXMgaW4gdGhlIDIwMDBzLCA4NCUgYXJlIG5vdCBVLlMuIGNpdGl6ZW5zLCB3aGlsZSBjdXJyZW50bHkgMTYlIGhhdmUgZ2FpbmVkIGNpdGl6ZW5zaGlwLiBXZSBleHBlY3QgaW1taWdyYW50cyB0byBnYWluIGNpdGl6ZW5zaGlwIG92ZXIgdGltZTsgdGhlcmVmb3JlLCBhc3N1bWUgdGhhdCB0aGUgcGVyY2VudCBvZiBub24tY2l0aXplbnMgZm9yIGEgZ2l2ZW4gaW1taWdyYW50IHBvcHVsYXRpb24gc2hvdWxkIGRlY3JlYXNlIGFzIHRpbWUgc3BlbnQgaW4gdGhlIFUuUy4gaW5jcmVhc2VzLgoKYGBge3IgZmlnLndpZHRoPTUsIGZpZy5oZWlnaHQ9NCwgZmlnLmZ1bGx3aWR0aD1UUlVFfQptZXhfY2l0aXplbgoKYGBgCgojIyBieSBDb3VudHJ5CgpUaGUgbGluZSBncmFwaCBiZWxvdyBpcyBhIGxpbmVhciByZXByZXNlbnRhdGlvbiBvZiB0aGUgdHJlbmQgb2JzZXJ2ZWQgaW4gdGhlICpNZWl4Y28gQmFyIENoYXJ0KiBmb3IgdGhlIHRvcCAyNSBmaXJzdC1nZW5lcmF0aW9uIHBvcHVsYXRpb25zIGluIHRoZSBVbml0ZWQgU3RhdGVzLgoKVGhlIHNpZ25pZmljYW50IHRyZW5kIGlzIHRoYXQgdGhlICoqc2xvcGUgb2YgZWFjaCBsaW5lIHBvc2l0aXZlbHkgY29ycmVsYXRlcyB0byBpdHMgY291bnRyaWVzIHJhdGUgb2YgY2l0aXplbnNoaXAqKi4KCmBgYHtyIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD02fQoKZ2dwbG90bHkobGluZXBsb3QpCmBgYAoKIyMgYnkgUmVnaW9uCgpgYGB7ciBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NX0KY2l0aXplbnNoaXBfYnlfcmVnaW9uCmBgYAoKIyAgey51bm51bWJlcmVkfQoKIyMjICoqRmluZGluZ3MqKgoKLSAgICoqSGlnaGxpZ2h0OioqIE1leGljbywgQ2hpbmEsIEluZGlhLCBDb2x1bWJpYSwgYW5kIEVsIFNhbHZhZG9yLgoKLSAgIENoaW5hIGFuZCBNZXhpY28gYXJlIHRoZSB0d28gbGFyZ2VzdCBpbW1pZ3JhbnQgcG9wdWxhdGlvbnMgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgYW5kIHNob3cgZGlzc2ltaWxhciBjaXRpemVuc2hpcCByYXRlcy4KCi0gICAqKkNoaW5lc2UgaW1taWdyYW50cyBhcmUgb25lIG9mIHRoZSBxdWlja2VzdCB0byBnYWluIGNpdGl6ZW5zaGlwLCB3aGlsZSBNZXhpY2FuJ3MgYXJlIHNvbWUgb2YgdGhlIHNsb3dlc3QuKioKCi0gICBJbmRpYSdzIGNpdGl6ZW5zaGlwIHJhdGUgbWlycm9ycyBDaGluYSdzLCB3aGlsZSBFbCBTYWx2YWRvciBpcyB2ZXJ5IHNpbWlsYXIgdG8gTWV4aWNvJ3MuIFRoZXJlIGlzIGEgcmVnaW9uYWwgdHJlbmQsIHdpdGggTGF0aW4gQW1lcmljYW4gY291bnRyaWVzIGdhaW5pbmcgY2l0aXplbnNoaXAgYSBsb3Qgc2xvd2VyIHRoYW4gdGhlIG90aGVyIHJlZ2lvbnMsIHBhcnRpY3VsYXJseSBBc2lhLgoKLSAgICoqQ29sdW1iaWEgaXMgYW4gb3V0bGllciB0byB0aGlzIHRyZW5kKiosIHNob3dpbmcgYSBjaXRpemVuc2hpcCByYXRlIGNsb3NlciB0byBDaGluYSBhbmQgSW5kaWEuIE9uZSBvZiB0aGUgb25seSBMYXRpbiBBbWVyaWNhbiBjb3VudHJpZXMgd2l0aCBzdWNoIGEgaGlnaCBjaXRpemVuc2hpcCByYXRlLgoKPGJyPgoKIyBGYW1pbHkgey50YWJzZXR9CgojIyMgKioqQXJlIGZpcnN0LWdlbmVyYXRpb24gQW1lcmljYW5zIGZpbmRpbmcgcGFydG5lcnMgYW5kIGhhdmluZyBraWRzPyoqKgoKIyMgYnkgQ291bnRyeQoKYGBge3IgZmlnLndpZHRoPTExLCBmaWcuaGVpZ2h0PTgsIGZpZy5mdWxsd2lkdGg9VFJVRX0KcGxvdF9ncmlkKGF2ZV9raWRzX3Bsb3QsIHBhcnRuZXJlZF9wbG90LCBheGlzPSJsIikKYGBgCgojIyBieSBSZWdpb24KCmBgYHtyfQojIGZpZy53aWR0aD0zLCBmaWcuaGVpZ2h0PTJ9CnBsb3RfZ3JpZChhdmVfa2lkc19yZWdfcGxvdCwgcGFydG5lcmVkX3JlZ19wbG90LCBheGlzPSJsIikKYGBgCgojIyBNYXJyaWFnZSB2cy4gQ2hpbGRyZW4KCklzIHRoZQoKYGBge3IgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9NSwgZmlnLmZ1bGx3aWR0aD1UUlVFfQptYXJyaWFnZV9raWRzCmBgYAoKIyAgey51bm51bWJlcmVkfQoKIyMjICoqRmluZGluZ3MqKgoKLSAgIFBlcmNlbnQgb2YgcG9wdWxhdGlvbiBwYXJ0bmVyZWQgKG1hcnJpZWQgb3IgbGl2aW5nIHdpdGggcGFydG5lcikgc2VlbXMgY29uc2lzdGVudCBhY3Jvc3MgbW9zdCBjb3VudHJpZXMgKipyYW5naW5nIGZyb20gMzIlIHRvIDM4JSoqLgoKICAgIC0gICBOYXRpb25zIHRoYXQgcHJhY3RpY2UgZm9ybXMgb2YgYXJyYW5nZWQgbWFycmlhZ2UsIEluZGlhLCBDaGluYSwgS29yZWEsIGFuZCBKYXBhbiBhcmUgYWxsIG9uIHRoZSB1cHBlciBlbmQgb2YgdGhhdCByYW5nZS4KCiAgICAtICAgSXNsYW5kIG5hdGlvbnMgb2YgRG9taW5pY2FuIFJlcHVibGljLCBIYWl0aSwgSmFtYWljYSwgYW5kIFB1ZXJ0byBSaWNvIGhhdmUgdGhlIGZvdXIgbG93ZXN0IHBlcmNlbnQgb2YgcG9wdWxhdGlvbiBtYXJyaWVkLgoKLSAgIEV1cm9wZWFuIGNvdW50cmllcyBjbHVzdGVyIGFyb3VuZCB0aGUgbG93IGVuZCBvZiBhdmVyYWdlIG51bWJlciBvZiBjaGlsZHJlbiBwZXIgcGVyc29uLCB3aXRoIHRoZSBVbml0ZWQgS2luZ2RvbSBhdCAwLjYgY2hpbGRyZW4gcGVyIHBlcnNvbi4gTGF0aW4gQW1lcmljYW4gY291bnRyaWVzIGNsdXN0ZXIgYXJvdW5kIHRoZSBoaWdoIGVuZCwgd2l0aCAqKkd1YXRlbWFsYSBtb3JlIHRoYW4gZG91YmxpbmcgdGhlIFVuaXRlZCBLaW5nZG9tIHdpdGggMS40IGNoaWxkcmVuIHBlciBwZXJzb24qKi4KCi0gICBUaGVyZSBkb2VzIG5vdCBzZWVtIHRvIGJlIGEgc3Ryb25nIGNvcnJlbGF0aW9uIGJldHdlZW4gbWFycmlhZ2UgYW5kIGF2ZXJhZ2UgbnVtYmVyIG9mIGNoaWxkcmVuLgoKPGJyPgoKIyBFZHVjYXRpb24gey50YWJzZXR9CgojIyMgKioqSG93IGVkdWNhdGVkIGFyZSBmaXJzdC1nZW5lcmF0aW9uIEFtZXJpY2Fucz8qKioKCiMjIGJ5IENvdW50cnkKCmBgYHtyIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03LCBmaWcuZnVsbHdpZHRoPVRSVUV9CmVkdV8yNV9wbG90CmBgYAoKIyMgYnkgUmVnaW9uCgpgYGB7ciBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD00LCBmaWcuZnVsbHdpZHRoPVRSVUV9CmVkdV9yZWdpb25fcGxvdApgYGAKCiMgIHsudW5udW1iZXJlZH0KCiMjIyAqKkZpbmRpbmdzKioKCi0gICAqKkluZGlhIGhhcyB0aGUgbW9zdCBlZHVjYXRlZCBmaXJzdC1nZW5lcmF0aW9uIHBvcHVsYXRpb24qKiwgd2l0aCA3NCUgb2YgdGhlIHBlb3BsZSBoYXZpbmcgYXQgbGVhc3QgYSBjb2xsZWdlIGRlZ3JlZSwgYW5kIGEgbWFzc2l2ZSAqKjQwJSBoYXZpbmcgZWl0aGVyIGEgbWFzdGVycyBvciBkb2N0b3JhdGUqKi4gSXJhbiBhbmQgUnVzc2lhIGFyZSB0aGUgbmV4dCBjbG9zZXN0IHdpdGggNjAlIG9mIHRoZWlyIHBvcHVsYXRpb25zIGhhdmluZyBhdCBsZWFzdCBhIGNvbGxlZ2UgZGVncmVlLgoKLSAgIFRoZSBjZW50cmFsIEFtZXJpY2FuIGNvdW50aWVzIG9mIEd1YXRlbWFsYSwgSG9uZHVyYXMsIEVsIFNhbHZhZG9yLCBhbmQgTWV4aWNvIGFsbCBoYXZlIGFyb3VuZCA1MCUgb2YgdGhlaXIgZmlyc3QtZ2VuZXJhdGlvbiBwb3B1bGF0aW9ucyB3aXRob3V0IGEgaGlnaCBzY2hvb2wgZGVncmVlLiBUaGlzIGlzIHNpZ25pZmljYW50IGJlY2F1c2UgNTAlIG9mIGFsbCBVLlMuIGltbWlncmF0aW9uIG9yaWdpbmF0ZXMgZnJvbSBMYXRpbiBBbWVyaWNhLgoKLSAgIFRoZSB0cmVuZCBob2xkcyB0cnVlIHdoZW4gbG9va2luZyBhdCB0aGUgZGlmZmVyZW50IHN1YiByZWdpb25zOyBob3dldmVyLCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGZpcnN0IGFuZCBsYXN0IGlzIGxlc3Mgc2V2ZXJlLiBBc2lhIGhhcyB0aGUgbW9zdCBlZHVjYXRlZCBmaXJzdC1nZW5lcmF0aW9uIGNvaG9ydCwgd2hpbGUgTGF0aW4gQW1lcmljYSBoYXMgdGhlIGxlYXN0IGVkdWNhdGVkLgoKPGJyPgoKIyBJbmNvbWUgey50YWJzZXR9CgojIyMgKkhvdyBkb2VzIGluY29tZSBkaWZmZXIgYmV0d2VlbiBkaWZmZXJlbnQgZmlyc3QtZ2VuZXJhdGlvbiBwb3B1bGF0aW9ucz8qCgojIyBieSBSZWdpb24KCmBgYHtyIGZpZy53aWR0aD05LCBmaWcuaGVpZ2h0PTYsIGZpZy5mdWxsd2lkdGg9VFJVRX0KCmdncGxvdGx5KHN1Yl9yZWdpb25fYm94KQpgYGAKCiMjIyAqKkZpbmRpbmdzKioKCi0gICBFdXJvcGVhbiBpbW1pZ3JhbnRzIGJvYXN0IHRoZSBoaWdoZXN0IGF2ZXJhZ2UgaW5jb21lLCBidXQgYWxzbyB0aGUgbGFyZ2VzdCBJUVIgYW1vbmcgYWxsIHJlZ2lvbnMuIEx1eGVtYm91cmcgYXQgdGhlIGhlYWQsIGFuZCBBbGJhbmlhIGF0IHRoZSB0YWlsLgoKLSAgIFRoZSBNaWRkbGUgRWFzdCByZWdpb24gaGFkIHRoZSBjb3VudHJ5IHdpdGggdGhlICoqaGlnaGVzdCBhdmVyYWdlIGluY29tZSwgS3V3YWl0IGF0IFwkODIsNzIzKiouIFRoZSBNaWRkbGUgRWFzdCBhbHNvIGhhZCB0aGUgbCoqb3dlc3QgYXZlcmFnZSBpbmNvbWUgd2l0aCBZZW1lbioqICoqYXQgXCQ3LDc3My4qKiBOb3RlOiBLdXdhaXQgd2FzIGFuIGV4dHJlbWUgb3V0bGllciBhbmQgd2FzIHRoZSBvbmx5IGNvdW50cnkgcmVtb3ZlZCBmb3IgZ3JhcGhpbmcgcHVycG9zZXMuCgotICAgTGF0aW4gQW1lcmljYSBzaG93ZWQgdGhlICoqbG93ZXN0IGluY29tZSBnYXBzKiogYmV0d2VlbiBjb3VudHJpZXMsIGJ1dCBhbHNvIGF2ZXJhZ2UgaW5jb21lcyB0aGF0IGNsdXN0ZXJlZCBhcm91bmQgdGhlICoqbG93ZXN0IG1lZGlhbiBvZiBcJDIxLDE5MC4qKgoKLSAgIE5pZ2VyaWEgaGFkIG9uZSBvZiB0aGUgaGlnaGVzdCBhdmVyYWdlIGluY29tZXMuIEkga25vdyB2ZXJ5IGxpdHRsZSBhYm91dCBOaWdlcmlhIGFuZCBpbiBmdXR1cmUgYW5hbHlzaXMgSSB3b3VsZCBsaWtlIHRvIGxvb2sgbW9yZSBpbnRvIHRoZSBjYXVzZSBvZiB0aGUgaW5jb21lIGdhcCBiZXR3ZWVuIE5pZ2VyaWEgYW5kIHRoZSBvdGhlciBBZnJpY2FuIG5hdGlvbnMuCgojIyBBdmVyYWdlIEluY29tZSBEaXN0cmlidXRpb24KCkJlbG93IGlzIHRoZSAqKkRpc3RyaWJ1dGlvbiBvZiB0aGUgQXZlcmFnZSBJbmNvbWUqKiBhdHRyaWJ1dGUuIFRoZSBhdmVyYWdlIGluY29tZXMgd2VyZSBnYXRoZXJlZCBmb3IgZWFjaCBmaXJzdC1nZW5lcmF0aW9uIHBvcHVsYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMuIFRoZSBkaXN0cmlidXRpb24gc2tld3Mgc2xpZ2h0bHkgbGVmdCwgYnV0IGlzIG92ZXJhbGwgcHJldHR5IG5vcm1hbCBmb3IgYW4gaW5jb21lIGRpc3RyaWJ1dGlvbi4gVGhlIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBjYW4gYmUgc2VlbiBpbiB0aGUgdGFibGUgYmVsb3cuCgpgYGB7ciBmaWcud2lkdGg9OSwgZmlnLmhlaWdodD02LCBmaWcuZnVsbHdpZHRoPVRSVUV9CiMgZmlnLmRpbSA9IGMoOCwgNiksIG91dC53aWR0aD0iNSUiLCBvdXQuaGVpZ2h0PSI1MCUiCnBsb3QoYXZlX2Vhcm5pbmdfZGlzdCkKCgpgYGAKCnwgU2FtcGxlIFNpemUgfCAgIE1lYW4gICB8IFN0YW5kYXJkIERldmlhdGlvbiB8Cnw6LS0tLS0tLS0tLS06fDotLS0tLS0tLTp8Oi0tLS0tLS0tLS0tLS0tLS0tLTp8CnwgUG9wdWxhdGlvbiAgfCBcJDI4LDMxNiB8ICAgICAgIDEwLDE4NCAgICAgICB8CgojIyBDZW50cmFsIExpbWl0IFRoZW9yZW0KCkJlbG93IGFyZSBoaXN0b2dyYW1zIHNob3dpbmcgdGhlIGRlbnNpdGllcyBvZiB0aGUgdmFyaW91cyBzYW1wbGUgbWVhbnMgb2YgMTAwMCByYW5kb20gc2FtcGxlcyBvZiBzYW1wbGUgc2l6ZXMgMTAsIDIwLCAzMCwgYW5kIDQwLiBUaGUgbWVhbnMgYW5kIHN0YW5kYXJkIGRldmlhdGlvbnMgY2FuIGJlIHNlZW4gaW4gdGhlIHRhYmxlIGJlbG93LgoKYGBge3IgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9NiwgZmlnLmZ1bGx3aWR0aD1UUlVFfQoKZ3JpZC5hcnJhbmdlKGNsdF8xMCwgY2x0XzIwLCBjbHRfMzAsIGNsdF80MCwgbnJvdyA9IDIsIG5jb2wgPSAyKQoKYGBgCgp8IFNhbXBsZSBTaXplIHwgICBNZWFuICAgfCBTdGFuZGFyZCBEZXZpYXRpb24gfAp8Oi0tLS0tLS0tLS0tOnw6LS0tLS0tLS06fDotLS0tLS0tLS0tLS0tLS0tLS06fAp8IFBvcHVsYXRpb24gIHwgXCQyOCwzMTYgfCAgICAgICAxMCwxODQgICAgICAgfAp8ICAgICAxMCAgICAgIHwgXCQyOCwzNzcgfCAgICAgICAzLDE0MCAgICAgICAgfAp8ICAgICAyMCAgICAgIHwgXCQyOCwyNzAgfCAgICAgICAyLDEyMyAgICAgICAgfAp8ICAgICAzMCAgICAgIHwgXCQyOCwzMzMgfCAgICAgICAxLDYzMiAgICAgICAgfAp8ICAgICA0MCAgICAgIHwgXCQyOCwyOTMgfCAgICAgICAxLDM0MCAgICAgICAgfAoKIyMjICoqRmluZGluZ3MqKgoKLSAgIFRoZSBmb3VyIGhpc3RvZ3JhbXMgY29uZmlybSB0aGF0IHRoZSAqKkF2ZXJhZ2UgSW5jb21lIGF0dHJpYnV0ZSBhYmlkZXMgYnkgdGhlIENlbnRyYWwgTGltaXQgVGhlb3JlbSoqLgoKLSAgIEFsbCBmb3VyIG9mIHRoZSAqKnNhbXBsZSBtZWFuIGhpc3RvZ3JhbXMgYXJlIG5vcm1hbCBkaXN0cmlidXRpb25zIHdpdGggYSBtZWFuIG9mIFx+XCQyOCwwMDAqKi4gVGhpcyBtYXRjaGVzIHRoZSBtZWFuIGluY29tZSBvZiB0aGUgcG9wdWxhdGlvbi4KCi0gICBBcyBleHBlY3RlZCwgdGhlICoqc3RhbmRhcmQgZGV2aWF0aW9ucyBvZiB0aGUgZGVuc2l0eSBoaXN0b2dyYW1zIGRlY3JlYXNlIGFzIHNhbXBsZSBzaXplIGluY3JlYXNlcy4qKiBUaGlzIGlzIHNlZW4gdmlzdWFsbHksIGFzIHRoZSBncmFwaHMgZ2V0IHByb2dyZXNzaXZlbHkgbmFycm93ZXIgYW5kIHRhbGxlciBmcm9tIHNhbXBsZSBzaXplIDEwIHRvIHNhbXBsZSBzaXplIDQwLiBFYWNoIGRpc3RyaWJ1dGlvbiBpcyBub3JtYWxseSBjZW50ZXJlZCBhcm91bmQgdGhlIHNhbWUgbWVhbi4KCiMjIFNhbXBsaW5nIG9mIEF2ZXJhZ2UgSW5jb21lCgpUaHJlZSBzYW1wbGluZyBtZXRob2RzIHdlcmUgdXNlZCB0byBhbmFseXplIHRoZSBiZWhhdmlvciBvZiBzYW1wbGluZyB0aGUgZmlyc3QtZ2VuZXJhdGlvbiBkYXRhc2V0LgoKMS4gICoqU2FtcGxlIFJhbmRvbSBTYW1wbGluZyoqIHdpdGhvdXQgUmVwbGFjZW1lbnQKMi4gICoqU3lzdGVtaWMgU2FtcGxpbmcqKiB3aXRoIFVuZXF1YWwgUHJvYmFiaWxpdGllcwogICAgLSAgICoqVW5lcXVhbCBwcm9iYWJpbGl0aWVzIHdlcmUgZGV0ZXJtaW5lZCB1c2luZyB0aGUgcG9wdWxhdGlvbiBvZiB0aGUgaW1taWdyYW50IGNvdW50cnkqKgozLiAgKipTdHJhdGlmaWVkIFNhbXBsaW5nKioKICAgIC0gICAqKlN0cmF0YSBkZXRlcm1pbmVkIGJ5IHRoZSBjb3VudHJ5IGNvdW50IGZvciBlYWNoIG9mIDcgZ2xvYmFsIHN1YiByZWdpb25zKiogKEFmcmljYW4sIEFzaWEsIEV1cm9wZSwgTGF0aW4gQW1lcmljYSwgTWlkZGxlIEVhc3QswqBOb3J0aCBBbWVyaWNhLCBhbmQgT2NlYW5pYSkuCgpgYGB7ciBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD02LCBmaWcuZnVsbHdpZHRoPVRSVUV9CgpncmlkLmFycmFuZ2UocG9wX2hpc3QsIHNyc3dvcl9oaXN0LCBzeXNfaGlzdCwgc3RyYXRhX2hpc3QsIG5yb3cgPSAyLCBuY29sID0gMikKCmBgYAoKfCAgIFNhbXBsZSBNZXRob2QgICAgfCAgIE1lYW4gICB8IFN0YW5kYXJkIERldmlhdGlvbiB8Cnw6LS0tLS0tLS0tLS0tLS0tLS0tOnw6LS0tLS0tLS06fDotLS0tLS0tLS0tLS0tLS0tLS06fAp8ICAgICBQb3B1bGF0aW9uICAgICB8IFwkMjgsMzE2IHwgICAgICAgMTAsMTg0ICAgICAgIHwKfCAgICAgICBTUlNXT1IgICAgICAgfCBcJDI4LDEwNiB8ICAgICAgIDksOTM0ICAgICAgICB8CnwgVW5lcXVhbCBTeXN0ZW1hdGljIHwgXCQyNSwxOTkgfCAgICAgICA4LDc1OSAgICAgICAgfAp8ICAgICBTdHJhdGlmaWVkICAgICB8IFwkMjYsMzE4IHwgICAgICAgOCwxNTUgICAgICAgIHwKCiMjIyAqKkZpbmRpbmdzKioKCi0gICAqKlNSU1dPUioqOiBhcyBleHBlY3RlZCwgb2JzZXJ2ZWQgYm90aCBhIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBleHRyZW1lbHkgY2xvc2UgdG8gdGhhdCBvZiB0aGUgcG9wdWxhdGlvbi4KCi0gICAqKlVuZXF1YWwgU3lzdGVtYXRpYyBhbmQgU3RyYXRpZmllZDoqKiBib3RoIG9ic2VydmVkIGEgbWVhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIGxlc3MgdGhhbiB0aGF0IG9mIHRoZSBwb3B1bGF0aW9uLgoKLSAgIFRoZSBcfioqMTAlIGRlY3JlYXNlIGluIG1lYW4gYXZlcmFnZSBpbmNvbWUqKiBhbmQgXH4qKjE1JSBkZWNyZWFzZSBpbiBzdGFuZGFyZCBkZXZpYXRpb24qKiBvYnNlcnZlZCB3aGVuIHNhbXBsaW5nIHVzaW5nIHVuZXF1YWwgc3lzdGVtYXRpYyBhbmQgc3RyYXRpZmllZCBtZXRob2RzIGNhbiBiZSBleHBsYWluZWQgYnkgbG9va2luZyBhdCB0aGUgTGF0aW4gQW1lcmljYW4gc3Vic2V0IG9mIHRoZSBmaXJzdC1nZW5lcmF0aW9uIHBvcHVsYXRpb24uCgogICAgLSAgIElmIHdlIGxvb2sgYXQgdGhlIHBpZSBjaGFydCBpbiB0aGUgKkltbWlncmF0aW9uKiBzZWN0aW9uLCB3ZSBjYW4gc2VlIHRoYXQgdGhlICoqTGF0aW4gQW1lcmljYSBjb2hvcnQgaXMgcmVzcG9uc2libGUgZm9yIDUwJSoqIG9mIGFsbCBpbW1pZ3JhdGlvbiBpbnRvIHRoZSBVbml0ZWQgU3RhdGVzLgoKICAgIC0gICBJZiB3ZSBsb29rIGF0IHRoZSBib3ggcGxvdCBpbiB0aGUgKkluY29tZSogc2VjdGlvbiB3ZSBjYW4gc2VlIHRoYXQgdGhlICoqTGF0aW4gQW1lcmljYSByZWdpb24gaGFzIHRoZSBsb3dlc3QgYXZlcmFnZSBpbmNvbWUqKiAqKmFuZCBsb3dlc3QgdmFyaWFuY2UqKiBhbW9uZyBhbGwgNyByZWdpb25zLgoKICAgIC0gICBXaGVuIHdlIHNhbXBsZSB1c2luZyB1bmVxdWFsIHN5c3RlbWF0aWMgYW5kIHN0cmF0aWZpZWQgbWV0aG9kcyB3ZSBhcmUgKiptb3JlIGxpa2VseSB0byBkcmF3IGNvdW50cmllcyBmcm9tIHRoZSBMYXRpbiBBbWVyaWNhIHN0cmF0YSoqICoqYmVjYXVzZSBvZiB0aGUgcmVnaW9ucyBsYXJnZSBwb3B1bGF0aW9uKiogYW5kIGJlY2F1c2UgdGhlIExhdGluIEFtZXJpY2EgcmVnaW9uIGhhcyB0aGUgbW9zdCBmaXJzdC1nZW5lcmF0aW9uIGNvdW50cmllcy4gVGhlIExhdGluIEFtZXJpY2FuIHJlZ2lvbiBoYXMgdGhlIGxvd2VzdCBhdmVyYWdlIGluY29tZSBhbmQgbGVhc3QgdmFyaWFuY2UsIHdoaWNoIHJlc3VsdHMgaW4gYSByZWxhdGl2ZSAqKmRlY3JlYXNlIGluIGJvdGggdGhlIG1lYW4gaW5jb21lIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24qKiBjb21wYXJlZCB0byB0aGUgcG9wdWxhdGlvbi4KCi0gICBJIHRoaW5rIHRoYXQgdGhlICoqdW5lcXVhbCBzeXN0ZW1hdGljIHNhbXBsZSBtZXRob2QgaXMgdGhlIG1vc3QgYWNjdXJhdGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGZpcnN0LWdlbmVyYXRpb24gcG9wdWxhdGlvbidzIGF2ZXJhZ2UgaW5jb21lKiogYmVjYXVzZSBpdCBhZGRzIGEgY291bnRyeSBwb3B1bGF0aW9uIGRpbWVuc2lvbiB0byBhdmVyYWdlIGluY29tZSB0aGF0IHRoZSBvdGhlciBmb3VyIG1ldGhvZHMgZG8gbm90LiBJbiBvdGhlciB3b3Jkcywgd2hlbiB1c2luZyBzeXN0ZW1hdGljIHNhbXBsaW5nIHdpdGggdW5lcXVhbCBwcm9iYWJpbGl0aWVzLCBjb3VudHJpZXMgd2l0aCBsYXJnZXIgaW1taWdyYW50IHBvcHVsYXRpb25zIGNvbnRyaWJ1dGUgbW9yZSB0byB0aGUgY2FsY3VsYXRlZCBhdmVyYWdlIGluY29tZS4gVGhpcyByZXN1bHRzIGluIGEgbWVhbiBpbmNvbWUgdmFsdWUgdGhhdCBpcyBtb3JlIHJlcHJlc2VudGF0aXZlIG9mIHRoZSBpbW1pZ3JhbnQgcG9wdWxhdGlvbi4KCiAgICAtICAgVG8gdXNlIGFuIGFuYWxvZ3ksIHRoZSBwb3B1bGF0aW9uIG1lYW4gaW5jb21lIGlzIHRvIHRoZSBTZW5hdGUsIGFzIHRoZSB1bmVxdWFsIHN5c3RlbWF0aWMgc2FtcGxpbmcgbWVhbiBpbmNvbWUgaXMgdG8gdGhlIEhvdXNlIG9mIFJlcHJlc2VudGF0aXZlcy4KCiMgIHsudW5udW1iZXJlZH0KCjxicj4KCiMgQXR0cmlidXRlIENvcnJlbGF0aW9uIHsudGFic2V0fQoKVGhlIGNvcnJlbGF0aW9uIG1hdHJpeCBiZWxvdyBzaG93cyBhIGxvdCBvZiBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRoZSBkaWZmZXJlbnQgYXR0cmlidXRlcyBleHBsb3JlZCBhYm92ZS4gVGhlIHRhYmJlZCBwbG90cyBkaXNwbGF5IHRoZXNlIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzLgoKIyMgQ29ycmVsYXRpb24gTWF0cml4CgpgYGB7ciBmaWcud2lkdGg9NCwgZmlnLmhlaWdodD00fQpjb3JycGxvdChjb3JfbWF0cml4ICwgdHlwZSA9ICJ1cHBlciIsIG9yZGVyID0gImhjbHVzdCIsIAogICAgICAgICB0bC5jb2wgPSAiYmxhY2siLCB0bC5zcnQgPSA0NSwgY29sPXZpcmlkaXMoMjUpWzE6MjBdKQoKYGBgCgojIyBDaGlsZHJlbiB2cy4gQXZlcmFnZSBFYXJuaW5ncwoKU3Ryb25nIE5lZ2F0aXZlIENvcnJlbGF0aW9uCgpgYGB7ciBmaWcud2lkdGg9OS41LCBmaWcuaGVpZ2h0PTYsIGZpZy5mdWxsd2lkdGg9VFJVRX0KY2hpbGRyZW5faW5jb21lCmBgYAoKIyMgRWR1Y2F0aW9uIHZzLiBBdmVyYWdlIEVhcm5pbmdzCgpTdHJvbmcgUG9zaXRpdmUgQ29ycmVsYXRpb24KCmBgYHtyIGZpZy53aWR0aD05LjUsIGZpZy5oZWlnaHQ9NiwgZmlnLmZ1bGx3aWR0aD1UUlVFfQplZHVfaW5jb21lCmBgYAoKIyMgQ2l0aXplbnNoaXAgdnMuIEF2ZXJhZ2UgRWFybmluZ3MKCk5vIENvcnJlbGF0aW9uCgpgYGB7ciBmaWcud2lkdGg9OS41LCBmaWcuaGVpZ2h0PTYsIGZpZy5mdWxsd2lkdGg9VFJVRX0KY2l0aXplbl9pbmNvbWUKYGBgCgojIyBFZHVjYXRpb24gdnMuIENpdGl6ZW5zaGlwCgpNb2RlcmF0ZSBQb3NpdGl2ZSBDb3JyZWxhdGlvbgoKYGBge3IgZmlnLndpZHRoPTkuNSwgZmlnLmhlaWdodD02LCBmaWcuZnVsbHdpZHRoPVRSVUV9CmNpdGl6ZW5fZWR1CmBgYAoKPGJyPiBcIyB7LnVubnVtYmVyZWR9CgojIEZ1dHVyZSBJbnZlc3RpZ2F0aW9uCgotICAgSSB3YW50IHRvIGV4cGxvcmUgc2Vjb25kLWdlbmVyYXRpb24gQW1lcmljYW4gZGF0YSB0byBsb29rIGF0IHRoZSBjaGFuZ2UgaW4gZWR1Y2F0aW9uIHJhdGVzLCBhbmQgaW5jb21lLiBBbmQgbG9vayBpbnRvIGhvdyB0aG9zZSBjaGFuZ2VzIGltcGFjdCBudW1iZXIgb2YgY2hpbGRyZW4gYmVjYXVzZSBhcyB3ZSBvYnNlcnZlZCwgdGhlcmUgd2FzIGEgc3Ryb25nIGNvcnJlbGF0aW9uIGJldHdlZW4gaW5jb21lIGFuZCBudW1iZXIgb2YgY2hpbGRyZW4uCi0gICBFdXJvcGVhbnMgaGF2ZSB0aGUgaGlnaGVzdCBhdmVyYWdlIGluY29tZSwgYnV0IGFyZSBub3QgdGhlIGhpZ2hlc3QgZWR1Y2F0ZWQgcmVnaW9uYWwgY29ob3J0LiBJIHdhbnQgdG8gZXhwbG9yZSB0aGUgcm9sbCBvZiBsYW5ndWFnZSBvbiBpbmNvbWUuCgojIFJlZmVyZW5jZXMKCjxodHRwczovL2RhdGEuY2Vuc3VzLmdvdi9tZGF0LyMvPgo=